//////////作用域
//如果一个变量在函数体内部申明，则该变量的作用域为整个函数体，在函数体外不可以引用改变量
function a(){
    var x=1;
    x=x+1;
    console.log(x);
}
//x=x+2;  输出reference ，无法在函数体外引用该变量
a();   //输出2



//如果两个函数各自申明了一个变量，那么该变量只在各自函数体中使用，两种互不影响
function b(){
    var x=1;
    x=x+10;
    console.log(x);
}
b();   //输出11
function c(){
    var x='A';
    x=x+'B';
    console.log(x);
}
c();   //输出AB



//由于JS函数可以嵌套，所以内部函数可以访问外部函数的变量，反之不行
function d(){
    var x=1
    function d1(){
        var y=x+1;
        console.log('y='+y);
    }
    d1();   //输出y=2
    console.log('x='+x);
    //var z=y+1
   // console.log('z='+z);    外部函数不可以访问内部函数的变量y
}
d();  //输出x=1



//如果内部函数的变量与外部函数的变量一样，则内部函数变量将屏蔽外部函数的变量
function e(){
    var x='A'
    function e1(){
        var x='B'
        console.log('内部函数='+x);
    }
    e1();   //内部函数=B
    console.log('外部函数='+x);
}
e();  //外部函数=A



//////////变量提升
//JS函数有个特点，他会先扫面整体函数，然后把所有变量提升到顶部(提升y的申明，并不会提升y的赋值)
function f(){
    var x='Hello,'+y   //提升y的申明，此时y的值为undefined
    console.log(x);
    var y='ljy'
}
f(); //输出 Hello,undefined
//f()提升y的申明，不会提升赋值，就相当于f1()
function f1(){
    var y   //此时y的值为undefined
    var x='Hello,'+y
    console.log(x);
    y='ljy'
}
f1();  //输出 Hello,undefined
function F(){
    var x=1  //此时x=1
    var y=x+1  //y=2
    var z  //z=undefined
    console.log(x,y,z);  //输出 1，2，undefined
}
F();



//////////全局作用域
//不在任何函数内定义的变量具有全局作用域。JS具有一个默认的全局对象window，全局作用域的变量实际上被绑定到window的一个属性
var g ='辣椒油爱上萝卜头'
alert(g)
alert(window.g)